package com.msb.bf;

import com.google.common.base.Joiner;
import com.google.common.collect.Lists;

import java.util.List;
import java.util.concurrent.TimeUnit;

/**
 * @author: zhaoyi
 * @create: 2020-05-09 12:25
 * @description: 打断线程的方式停止他
 **/

public class InterruptThread {

    public static void main(String[] args) throws InterruptedException {

        final Object lock = new Object();
        List<Integer> list = Lists.newArrayList();
        /**
         * 整个这种thread写法其实是**错误**的
         *      Thread的 interrupt 上注释已经说明白了
         *      线程在sleep或wait,join， 此时如果别的进程调用此进程的 interrupt（）方法，
         * 此线程会被唤醒并被要求处理InterruptedException；(thread在做IO操作时也可能有类似行为）
         * 所以正常是不会sleep的是不会有机会响应InterruptedException的
         */
        Thread thread = new Thread(() -> {
            synchronized (lock) {
                //这样写 InterruptedException被捕获继续进行 集合是 0 - 9 一个不少

                /*for (int i = 0; i < 10; i++) {
                    try {
                        Thread.sleep(500);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    // catch  InterruptedException会继续执行下去
                    list.add(i);
                }*/

                //这样写 list是空的
                try {
                    for (int i = 0; i < 10; i++) {
                        Thread.sleep(500);
                        list.add(i);
                    }
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        });

        thread.start();
        thread.interrupt();//会收到InterruptedException，是否停止释放资源等 自己处理
        thread.join();
        System.out.println(Joiner.on(",").join(list));


        Thread thread1 = new Thread(() -> {
            synchronized (lock) {
                while (!Thread.currentThread().isInterrupted()) {
                    System.out.println("没有被打断，我可以继续玩 。。。。");
                    //这里捕获异常处理了上面的isInterrupted就捕获不到了
                    /*try {
                        Thread.sleep(500);
                    } catch (InterruptedException e) {
                        System.out.println("InterruptedException 这里捕获异常处理了上面的isInterrupted就捕获不到了 ");
                    }*/
                }
                //被打断可以做些操作，比如释放资源啥的
                System.out.println("。。。释放资。。。");
            }
        });

        thread1.start();
        TimeUnit.SECONDS.sleep(5);
        //这个join一定要在interrupt下面不然 执行不到
        thread1.interrupt();
        thread1.join();

    }
}
